home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
JCSM Shareware Collection 1996 September
/
JCSM Shareware Collection (JCS Distribution) (September 1996).ISO
/
prgtools
/
disas.zip
/
LEESMIJ.TXT
< prev
next >
Wrap
Text File
|
1994-05-01
|
20KB
|
501 lines
_______
____|__ | (R)
--| | |-------------------
| ____|__ | Association of
| | |_| Shareware
|__| o | Professionals
-----| | |---------------------
|___|___| MEMBER
Het programma dat hieronder wordt beschreven is gemaakt door
Feico Nater Shareware,
Beukweg 24,
7556 DE Hengelo.
Dit programma wordt beschikbaar gesteld als shareware. Wat
is shareware? Het is software dat door de gebruikers gecopieerd
en uitgedeeld mag worden, maar ik, de auteur behoud het auteurs-
recht. Misschien heeft u het programma voor een laag bedrag
`gekocht' van een bulletin-board en er voor betaald, maar ik
krijg daar geen cent van. Ik verwacht dat u mij rechtstreeks
betaalt, want ik verdien mijn levensonderhoud met het maken van
shareware.
Dus, als dit programma u bevalt en u besluit het te gebrui-
ken, dan wordt van u verwacht dat u een bedrag van 69 gulden
(inclusief BTW) overmaakt op mijn rekening bij de Postbank,
nummer 96541. Helaas kan ik geen kredietkaarten accepteren.
Waarom zou u registreren? Het kost u natuurlijk geld. Maar
ik zal u op de hoogte houden van verdere ontwikkelingen en u
krijgt het recht om nieuwere versies te bestellen voor de prijs
van porto en floppy. Tenslotte zal ik bereid zijn om naar uw
verlangens te luisteren.
En als het programma u niet bevalt? Dan kan u het weggooi-
en. Maar ongetwijfeld zal het idee van shareware u bevallen,
omdat u niet veel geld hoeft te betalen voor iets dat achteraf
toch tegenvalt.
Maar of u nu registreert of niet, u wordt aangemoedigd dit
systeem verder rond te delen. Geef copieën aan uw vrienden. De
copieën die u ronddeelt moeten volledig en ongewijzigd zijn, maar
gebruik van file-compressie is toegestaan. U mag alleen een
maximum van tien gulden vragen voor de floppy, verpakking en
verzending.
Over de auteur
Ik werk met computers sedert 1970. Ik heb een HBO-studie
in informatica voltooid. Daarna heb ik vele jaren gewerkt in de
defensie-industrie, en mijn collega's beschouwden mij als de
bekwaamste programmeur onder hen. Maar dank zij Gorbatsjov (wat
ik hem niet kwalijk kan nemen) ging het slechter met de defensie-
industrie. Sindsdien werk ik als shareware-auteur.
*******************************
* D I S A S T E R *
*******************************
Disaster is een interactieve disassembler voor de IBM-PC.
Een disassembler is niets bijzonders. Het programma DEBUG
wordt bij MSDOS geleverd en bevat een disassembler. Maar DEBUG
kent alleen de instructies van de 8086 en 8088. Verder levert
DEBUG geen coding die geschikt is om weer als input voor een
assembler te dienen.
Geen enkele disassembler maakt met één druk op de knop een
keurig assemblerprogramma. In tegendeel, het disassembleren van
een beetje programma is vele dagen werk.
De eenvoudigst denkbare disassembler werkt rechttoe-rechtaan.
Hij leest het machinetaalprogramma van voor tot achter en
vertaalt alles naar assembler-taal, ongeacht of het code of data
is.
Disaster werkt interactief. U kan het machinetaalprogramma op
uw gemak bekijken, labels en commentaar toevoegen, aangeven wat
code en wat data is. Het resultaat kan worden opgeborgen om de
volgende dag verder te kunnen gaan. Tenslotte maakt DISASTER een
correct assemblerprogramma.
Deze gebruiksaanwijzing is heel kort. Er is niet meer uit te
leggen. Kennis van de PC en de assembleertaal wordt echter
bekend verondersteld.
SAMENVATTING VAN COMMANDO'S (in plaats van een adres is altijd
een label toegestaan)
; adres,commentaar geef commentaar op
; adres,- verwijder commentaar
A adres,adres automatische generatie van labels
B adres,adres automatische generatie van controls
en labels
C adres,letter control code of data
C adres,- verwijder control
F ???? zoek woord
L adres,label geef een label op
L adres,- verwijder een label
L oude-naam,nieuwe-naam vervang een label
Q stop, of sluit uitvoerfile
R prognaam lees een programma in
S schrijf een script-file
U adres,adres disassembleer
W maak output-file
DEMONSTRATIE
U start DISASTER de eerste keer met het commando:
DISASTER
Er komt nu een foutmelding die u mag negeren. Op het scherm
verschijnt de prompt --> om aan te geven dat DISASTER uw
commando's verwacht.
Vervolgens leest u een programma in met het commando:
R naam.EXE
of:
R naam.COM
of:
R naam.SYS
Wil u iets disassembleren wat reeds in het geheugen staat, dan
is het commando:
R segmentadres.ROM
Nu moet u eerst aangeven dat uw programma als instructiecode
moet worden gedisassembleerd met het commando (precies zo):
C Lstartlocation,I
Nu begint het disassembleren! Geef het commando:
U Lstartlocation
wat resulteert in een stukje gedisassembleerd programma op het
scherm. Links verschijnen de adressen, daarnaast de mnemonische
code, en rechts (in kleur) de oorspronkelijke machinetaal. Een
groen blokje betekent dat er geen geldige opcode werd gevonden.
Voorvoegsels komen in geel, opcodes in groen, modrm-bytes en sib-
bytes in rood, operanden in blauw.
Varianten op het U-commando zijn:
U adres disassembleer 20 regels vanaf adres
U adres,adres disassembleer van .. tot ..
U disassembleer volgende 20 regels
<return> idem
Adressen in commando's worden altijd hexadecimaal opgegeven.
In plaats van adressen kan u ook labels (zie hierna) opgeven.
HULP
Hulpteksten verschijnen met de toetsen F5 tot en met F10. Een
willekeurige toets verwijdert de tekst weer.
Druk liever niet op de hulptoetsen terwijl DISASTER met een
opdracht bezig is, het heeft enigszins vreemde (geen ernstige)
gevolgen.
F1 en F3 kunnen, net als in COMMAND.COM, worden gebruikt om
commando's te herhalen, en de toetsen Insert, Delete en Backspace
werken normaal. LABELS
Alle adressen komen hexadecimaal op het scherm. Natuurlijk wil
u labels zien. Dat kan met het commando:
L adres,label
Een label moet, zoals gebruikelijk, met een letter beginnen.
Verder moet minstens een keer de letter G tot en met Z er in
voorkomen. De maximale lengte van een label is veertien tekens.
Komt in een label geen van de letters G tot en met Z voor, dan
beschouwt DISASTER het als een hexadecimaal adres.
Wees voorzichtig met het gebruik van labels die met de letter
L beginnen. De functie die automatisch controls genereert
veronderstelt namelijk dat zo'n label bij instructiecode staat.
Labels kunnen worden gebruikt in commando's. Het U commando
wordt dan bijvoorbeeld: U label,label.
Labels kunnen worden verwijderd met het commando:
L label,-
of, wat op het zelfde neerkomt:
L adres,-
Labels kunnen van naam worden veranderd met het commando:
L oude naam,nieuwe naam
Het is niet mogelijk twee labels op het zelfde adres te
definiëren.
Het maximale aantal labels is 4090.
INITIEEL GEGENEREERDE LABELS
Als u een file inleest, dan genereert Disaster automatisch een
aantal labels in de header van de file. De meeste van deze
labels beginnen met de letter Z. Er komt ook een label et de
naam LSTARTLOCATION, en dat is het adres waar de executie begint. CONTROLs
Niet alles wat u ziet is instructiecode. Er is ook data. De
disassembler kan echter het verschil niet zien. Bovendien
bestaat er code en data in soorten. U moet zelf aangeven wat
code en wat data is en welke soort het is. Dat gaat door
controls te zetten met het commando:
C adres,letter(s)
of, wat op het zelfde neerkomt:
C label,letter(s)
Een control kan worden verwijderd met:
C adres,-
of:
C label,-
Vanaf het aangegeven adres wordt gedisassembleerd volgens de
letter.
Die letter kan zijn:
B hexadecimale bytes
T tekst tussen quotes, voor zover mogelijk
W hexadecimale woorden
I instructiecode voor Intel chips
IV instructiecode voor NEC V20 of V30
IA instructiecode voor 80386 in protected mode met een
operand- en adreslengte van 32 bits.
B, T en W zijn data-controls, de overige zijn code-controls.
Dit is een belangrijk onderscheid voor de verderop besproken A-
en B-commando's.
De controls delen uw programma in stukken. Er zijn datastukken
en codestukken.
Als DISASTER een opcode tegenkomt die geldig is op NEC-chips
maar niet op Intel-chips, of andersom, dan wordt die gewoon
gedisassembleerd. Of I of IV werd opgegeven is dan niet van
belang. Maar er zijn opcodes die bij NEC en Intel iets anders
betekenen. In dat geval beslist I of IV. Programma's waarbij
het onderscheid tussen I en IV belangrijk is zijn overigens
zeldzaam.
IA kan alleen worden gebruikt bij programma's die op de 80386
in protected mode draaien. In real mode geldt immers altijd een
default-adres- en -operand-lengte van 16 bits.
Het maximale aantal controls is 16380.
INITIEEL OPGEVOERDE CONTROLS
Leest u een file in, dan worden automatisch wat controls bij
de velden van de header gezet.
In het grootste deel van uw programma geldt een T-control. Dat
mag vreemd lijken, maar het is gedaan omdat nog niet bekend is
waar de overige controls moeten staan, en de T-control maakt het
herkennen van leesbare tekst gemakkelijk.
AUTOMATISCH GENEREREN VAN LABELS
Het handmatig plaatsen van de labels en controls is een enorm
karwei. Daarom is dit werk in DISASTER gedeeltelijk
geautomatiseerd.
Labels worden automatisch gegenereerd met het commando:
A adres,adres
DISASTER doorzoekt nu uw programma, en geeft tegelijk een
listing op het scherm. Alleen de codestukken worden onderzocht,
datastukken worden overgeslagen. Elke keer als DISASTER een
adresverwijzing tegenkomt wordt hiervoor een label opgevoerd.
Zo'n opgevoerd label heeft de vorm: L45A3_27E5.
De eerste letter van het opgevoerde label geeft het soort
verwijzing aan:
L spronginstructie
W woorddata
T bytedata
Na die eerste letter komt het hexadecimale adres waar het label
naar verwijst, want het kind moet een naam hebben. Daarna een
onderstreping, en ten slotte het adres waar de verwijzing voor
het eerst werd aangetroffen. Dat laatste vergemakkelijkt het
onderzoek van het programma.
Elke keer als een label wordt opgevoerd toont DISASTER een
blokje op het scherm. Zo'n blokje komt dus te staan bij iedere
JMP- en CALL-instructie en bij iedere geheugenverwijzing waar nog
geen label aanwezig is.
AUTOMATISCH GENEREREN VAN CONTROLS
Controls worden automatisch gegenereerd met het commando
B adres,adres
DISASTER doorzoekt nu de labels van uw programma. Elke keer
als DISASTER in een datastuk een label tegenkomt dat met een L
begint wordt hier een control I opgevoerd, zodat de verdere
programmatekst als instructiecode wordt geïnterpreteerd. Bij de
eerstvolgende onvoorwaardelijke RET- of JMP-instructie wordt een
control opgevoerd om de oorspronkelijke toestand te herstellen.
Elke keer als een control wordt opgevoerd toont DISASTER een
blokje op het scherm. Zo'n blokje komt dus:
1 bij een label dat met een L begint en dat in een datagebied
stond.
2 bij de eerste RET- of JMP-instructie daarna.
Elke keer als een control I wordt opgevoerd, wordt bovendien
het betreffende stuk doorzocht naar adresverwijzingen, waar dan
(zoals in het vorige hoofdstuk stond) labels voor worden
gegenereerd.
GEBRUIK VAN DE MUIS
U wil misschien een label of control opvoeren, maar u weet het
precieze adres niet. Bijvoorbeeld, de disassembly bevat de
regel:
0357 DB 'Press any key',0,'Invalid command'
Er moet een label achter de letter I. Type nu L, neem de muis
en klik met de linker knop op de letter I. Het gewenste adres
verschijnt op de commandoregel, net alsof u het zelf intypte.
Maak het commando verder af.
Klikt u met de linker knop ergens op de disassembly, dan
verschijnt het adres van het punt waar u klikte op de
commandoregel. Klikt u met de rechter knop, dan verschijnt het
getal of label op de commandoregel.
De linker knop werkt niet goed als er een regelomhaal op het
scherm is gekomen.
AANWIJZINGEN
Meestal begint een disassembly aldus:
C:\disaster Start DISASTER
--->Rprogr.com lees het programma
--->B100,ffff genereer labels en controls
--->B100,ffff
--->B100,ffff
--->B100,ffff
Op het scherm ziet u hoe steeds meer labels worden geplaatst
en hoe steeds meer code-controls worden gezet.
Het commando B100,ffff kan eenvoudig worden herhaald met de F3-
toets. Herhaal het tot DISASTER meldt dat er niet meer labels
en controls zijn toegvoegd.
Als het een beetje wil is de disassembly hiermee al haast
voltooid, en u hoeft er niets voor te doen! Kom daar eens om bij
een andere disassembler.
Kan er dan niets foutgaan? Helaas, niets is volmaakt,
bijvoorbeeld in de volgende gevallen:
0150 JNZ L0123
0152 JZ L0156
0154 ADD B[BX+SI],AL
Het B-commando denkt dat de laatste instructie code is, want
er staat geen onvoorwaardelijke sprongopdracht voor. Maar JNZ
en JZ zijn samen onvoorwaardelijk. De coding vanaf adres 0154
zal dus als instructiecode worden beschouwd. Komen hier dingen
voor die lijken op instrcties met adresverwijzingen, dan worden
er valse labels gegenereerd.
Als u oplet tijdens de uitvoering van het B-commando, dan zal
u dit onheil wel opmerken. Onderbreek het commando met een
willekeurige toets, blader met het U-commando door het programma
om de juiste plek te vinden en zet op adres 0154 een data-
control.
INT 020
Dit is het einde van het programma, wat trouwens ook geldt voot
INT 021 met AH=00 of 04C. Het B-commando herkent dit niet. U
moet zelf hierachter een data-control zetten.
JMP [08170+BX]
Dit is een sprong via een tabel van sprongadressen. Dit wordt
door DISASTER niet herkend. U moet zelf labels toekennen aan de
adressen in de tabel. Gebruikt u labels die met een L beginnen,
dan zal het B-commando de gelabelde tekst als code beschouwen.
COMMENTAAR
U kan commentaar toevoegen met het commando:
;adres,tekst
en natuurlijk ook met
;label,tekst
Let op de kommapunt die dit commando inluidt!
Commentaar kan worden verwijderd met:
;adres,-
of:
;label,-
Commentaar wordt getoond voorafgaand aan het genoemde adres.
In een data-gedeelte veroorzaakt het commentaar een nieuwe regel.
Een commentaar middenin een instructie of midden in een woord-
constante wordt genegeerd.
De backslash \ heeft een speciale betekenis: hij levert een
nieuwe regel op, zodat een commentaar meerdere regels kan
omvatten. Twee backslashes aan het begin van een commentaar
geven een nieuwe pagina.
;adres,commentaar van een regel
;adres,\een regel met een lege regel ervoor
;adres,\\eerste regel op een pagina\volgende regel
De maximale lengte van een commentaarregel is 127 bytes.
Er kunnen geen twee commentaarregels op een adres staan.
De maximale hoeveelheid commentaar is ongeveer 62500 bytes,
plus wat overhead.
Verder zal u, natuurlijk, de gegenereerde labels vervangen door
namen die duidelijk aangeven wat er gebeurt. OPTIES
Sommige instellingen van de disassembler kunnen veranderd
worden. Een optie kan worden aangezet met de letter O, gevolgd
door de letter die de optie aangeeft. Een optie kan worden
uitgezet met de letter O, de letter die de optie aangeeft, een
komma en een streepje. De volgende opties zijn beschikbaar.
OP geheugenverwijzing voorafgegaan door B, W of D
OP,- geheugenverwijzing voorafgegaan door BYTE PTR or
(D)WORD PTR
OL code labels op een aparte regel
OL,- labels en code op dezelfde regel
OA adresses naar file en scherm
OA,- adressen alleen naar het scherm
OH hexadecimale waarden worden voorafgegaan door een nul
als het eerste cijfer anders A-F zou zijn, en ze worden
gevolgd door de letter h.
OH,- hexadecimale waarden worden altijd voorafgegaan door
een nul en niet gevolgd door een h.
OO impliciete operanden na XLAT, MOVS, OUTS, SCAS en
dergelijke instructies worden altijd gegenereerd.
OO,- impliciete operanden worden alleen gegenereerd als
er een segment override is.
Druk op F10 om de huidige instelling van de opties te zien.
MAKEN VAN EEN SOURCE-FILE
Het uiteindelijke doel van disassembleren is dat er een source-
file ontstaat. Deze source-file kan met een assembler weer
geassembleerd worden. De source-file wordt geopend met het
commando
W
De source-file heeft de zelfde naam als de .SYS-, .EXE- of
.COM-file, doch met de extensie .8.
Zolang de source-file open is is de prompt >>>. Alleen de
commando's O, U en Q zijn nu toegestaan.
Na het commando W geeft u een of meer U-commando's. Op het
scherm komen nu alleen nog maar de adressen, de gedisassembleerde
tekst gaat naar de file.
Tenslotte sluit u de file met het commando
Q
Nu verschijnt weer de prompt -->.
Wellicht verwacht u dat u, door de source-file weer te
assembleren, weer de zelfde .COM- of .EXE-file terugkrijgt. In
de praktijk zal dat tegenvallen, omdat meerdere machine-
instructies de zelfde functie hebben. Bijvoorbeeld:
MOV AX,BX 8BC3 of 89D8
REP MOVSB F3A4 of F2A4
ADD BX,5 83C305 of 81C30500
JMP $+8 EB06 of E90500
Verder zijn er instructies denkbaar die voor de processor niet
uitvoerbaar zijn, zoals SHL AL,30 of BOUND AX,BX. DISASTER
accepteert zulke instructies, de assembler zal ze misschien
weigeren. STOPPEN EN VERDERGAAN
U heeft na vele uren werk uw programma uitgebreid met Labels
en Controls. Om de volgende dag verder te kunnen gaan geeft u
het commando:
S
Er wordt nu een zogenaamde scriptfile gemaakt. Deze heeft de
extensie .SCR en, als u geen andere naam opgaf, dezelfde naam als
uw programma.
Bestaat de scriptfile al, dan vraagt DISASTER om bevestiging.
Tenslotte stopt u met het commando:
Q
Is er nog geen scriptfile gemaakt , dan vraagt DISASTER om
bevestiging.
Om verder te gaan start u de disassembler met het commando
DISASTER filenaam
waarbij u de naam van de scriptfile opgeeft. DISASTER onderzoekt
namelijk eerst of de opgegeven filenaam een scriptfile is. Is
dat niet het geval, dan zoekt DISASTER een .COM- of .EXE-file.
Een scriptfile is een ASCII-file en bevat gewone commando's
voor de disassembler. Niets verbiedt u de scriptfile met een
teksteditor te bewerken.